#ifndef __SC_FUNC_PTR_WRAPPER_H__
#define __SC_FUNC_PTR_WRAPPER_H__

////////////////////////////////////////////////////////////////////////////////
// Includes
////////////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <string>

#include "SCSystem.hpp"

#include "SC_LibConfig.h"

////////////////////////////////////////////////////////////////////////////////
// Namespaces
////////////////////////////////////////////////////////////////////////////////

namespace SC {

////////////////////////////////////////////////////////////////////////////////
// Implementation
////////////////////////////////////////////////////////////////////////////////

/// Define a systemic computation function pointer
typedef bool (*SCFuncPtr)(SCSystem &, SCSystem &, SCSystem &);

/**
 *  This class defines a "pointer to a systemic computation function" wrapper.
 */
class LIBRARY_DECL SCFuncPtrWrapper {
	
	public:
	
		/// Constructs by default a null pointer wrapper
		SCFuncPtrWrapper(
			const std::string & name = "NOP",
			SCFuncPtr ptr = NULL
		) : name(name), ptr(ptr) {}

		/// Create a copy of the given instance
		SCFuncPtrWrapper(const SCFuncPtrWrapper & inst)
		: name(inst.name), ptr(inst.ptr) {}
		
		// Affectation operator
		SCFuncPtrWrapper & operator =(const SCFuncPtrWrapper & inst) {
			if (this != &inst) {
				this->name = inst.name;
				this->ptr = inst.ptr;
			}
			return *this;
		}

		/// Returns the function name
		const std::string & Name() const { return this->name; }

		/// Returns the function pointer
		const SCFuncPtr & Ptr() const { return this->ptr; }

	protected:
		
		/// Function name
		std::string name;
		
		/// Pointer to a systemic computation function
		SCFuncPtr ptr;
	
};

////////////////////////////////////////////////////////////////////////////////
// Closing Namespaces
////////////////////////////////////////////////////////////////////////////////

}

////////////////////////////////////////////////////////////////////////////////

#endif
